home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / CheckOffsets.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  6KB  |  336 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *      RSysCheckOffsets.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    void PrintDevOffsets ( RSYS_LIBRARY *lib );
  12.    *    void PrintLibOffsets ( RSYS_LIBRARY *lib );
  13.    *    void SysCheckOffs ( void );
  14.    *
  15.    *      --- Lokale  Routinen ---
  16.    *
  17.    *    static void KillMemory ( int kill );
  18.    *    static void makeblank ( void );
  19.    *    static void makeentry ( ULONG adr , RSYS_FUNCTION *func );
  20.    *    static void makehead ( char *title );
  21.    *    static void makeinfo ( LIBRARY *library , LIST *list );
  22.    *    static void makerominfo ( UBYTE *title , ULONG num );
  23.    *    static void makeromsizeinfo ( UBYTE *title , ULONG num );
  24.    *    static void makesummary ( int count );
  25.    *
  26.    * Bemerkungen:
  27.    *      Ermittlung der gepatchten Libraries und Devices im ROM.
  28.    *
  29.    * Erstellungsdatum:
  30.    *      07-Jul-93     Rolf Böhme
  31.    *
  32.    * Änderungen:
  33.    *      07-Jul-93     Rolf Böhme        Erstellung
  34.    *
  35.    ***************************************************************************
  36.  */
  37.  
  38. #include "RSys.h"
  39. #include "protos.h"
  40.  
  41.  
  42. static ULONG kickromstart;
  43.  
  44. static void
  45. KillMemory (int kill)
  46. {
  47.   FREEF (TRUE);
  48.  
  49.   if (kill)
  50.     ErrorHandle ("Library offset memory", MEMORY_ERR, ALLOC_FAIL, KILL);
  51.  
  52.   return;
  53. }
  54.  
  55. static void
  56. makeblank (void)
  57. {
  58.   NODE *blanknode = ALLOCF (sizeof (*blanknode));
  59.  
  60.   if (blanknode)
  61.     {
  62.       AddTail (&FuncList, blanknode);
  63.       return;
  64.     }
  65.  
  66.   KillMemory (KILL);
  67.  
  68.   return;
  69. }
  70.  
  71. static void
  72. makehead (char *title)
  73. {
  74.   NODE *newnode = ALLOCF (sizeof (*newnode));
  75.  
  76.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  77.     {
  78.       sprintf (newnode->ln_Name, "---- %s", title);
  79.       AddTail (&FuncList, newnode);
  80.  
  81.       return;
  82.     }
  83.  
  84.   KillMemory (KILL);
  85.  
  86.   return;
  87. }
  88.  
  89. static void
  90. makerominfo (UBYTE * title, ULONG num)
  91. {
  92.   NODE *newnode = ALLOCF (sizeof (*newnode));
  93.  
  94.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  95.     {
  96.       sprintf (newnode->ln_Name, "%s : 0x%08lX", (char *) title, num);
  97.       AddTail (&FuncList, newnode);
  98.  
  99.       return;
  100.     }
  101.  
  102.   KillMemory (KILL);
  103.  
  104.   return;
  105. }
  106.  
  107. static void
  108. makeromsizeinfo (UBYTE * title, ULONG num)
  109. {
  110.   NODE *newnode = ALLOCF (sizeof (*newnode));
  111.  
  112.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  113.     {
  114.       sprintf (newnode->ln_Name, "%s : %ld Bytes", (char *) title, num);
  115.       AddTail (&FuncList, newnode);
  116.  
  117.       return;
  118.     }
  119.  
  120.   KillMemory (KILL);
  121.  
  122.   return;
  123. }
  124.  
  125. static void
  126. makeinfo (LIBRARY * library, LIST * list)
  127. {
  128.   NODE *newnode = ALLOCF (sizeof (*newnode));
  129.  
  130.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  131.     {
  132.       sprintf (newnode->ln_Name, "(%ld funcs [%ld FDs] at 0x%08lX)",
  133.            (library->lib_NegSize / 6), CountNodes (list), library);
  134.  
  135.       AddTail (&FuncList, newnode);
  136.  
  137.       return;
  138.     }
  139.  
  140.   KillMemory (KILL);
  141.  
  142.   return;
  143. }
  144.  
  145. static void
  146. makeentry (ULONG adr, RSYS_FUNCTION * func)
  147. {
  148.   NODE *newnode = ALLOCF (sizeof (*newnode));
  149.  
  150.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  151.     {
  152.       sprintf (newnode->ln_Name, EntryAttr[LIBRARYOFFS].ea_dataformat,
  153.        func->f_bias, adr, func->f_public ? "pub" : "prv", func->f_name);
  154.  
  155.       AddTail (&FuncList, newnode);
  156.  
  157.       return;
  158.     }
  159.  
  160.   KillMemory (KILL);
  161.  
  162.   return;
  163. }
  164.  
  165. static void
  166. makesummary (int count)
  167. {
  168.   NODE *newnode = ALLOCF (sizeof (*newnode));
  169.  
  170.   if (newnode && (newnode->ln_Name = ALLOCF (BUFSIZE)))
  171.     {
  172.       sprintf (newnode->ln_Name, "-> %4ld patched offsets found", count);
  173.  
  174.       AddTail (&FuncList, newnode);
  175.  
  176.       return;
  177.     }
  178.  
  179.   KillMemory (KILL);
  180.  
  181.   return;
  182. }
  183.  
  184. void
  185. PrintLibOffsets (RSYS_LIBRARY * lib)
  186. {
  187.   RSYS_FUNCTION *func;
  188.   RSYS_func *funcptr;
  189.   NODE *fnode;
  190.   LIBRARY *library;
  191.   int j = 0;
  192.  
  193.   makehead (lib->l_name);
  194.  
  195.   library = OpenLibrary ((STRPTR) lib->l_name, 0L);
  196.   if (library)
  197.     {
  198.       makeinfo (library, &(lib->l_functions));
  199.  
  200.       Forbid ();
  201.  
  202.       for (fnode = lib->l_functions.lh_Head; fnode->ln_Succ; fnode = fnode->ln_Succ)
  203.     {
  204.       func = (RSYS_FUNCTION *) fnode;
  205.       funcptr = (RSYS_func *) ((ULONG) library - (ULONG) func->f_bias);
  206.  
  207.       if ((funcptr->adr < kickromstart) || (funcptr->adr > MAGIC_ROM_END))
  208.         {
  209.           makeentry (funcptr->adr, func);
  210.           j++;
  211.         }
  212.     }
  213.  
  214.       Permit ();
  215.  
  216.       CloseLibrary (library);
  217.  
  218.       makesummary (j);
  219.     }
  220.   else
  221.     makehead ("Can't open library!");
  222.  
  223.   makeblank ();
  224.  
  225.   return;
  226. }
  227.  
  228. void
  229. PrintDevOffsets (RSYS_LIBRARY * lib)
  230. {
  231.   RSYS_FUNCTION *func;
  232.   RSYS_func *funcptr;
  233.   NODE *fnode;
  234.   LIBRARY *library;
  235.   IOREQUEST ioreq;
  236.   int unit = 0;
  237.   int j = 0, err;
  238.  
  239.   makehead (lib->l_name);
  240.  
  241.   memset (&ioreq, 0, sizeof (ioreq));
  242.  
  243.   if (!strcmp (lib->l_name, "console.device"))
  244.     unit = -1;
  245.  
  246.   err = OpenDevice ((STRPTR) lib->l_name, unit, &ioreq, (ULONG) unit);
  247.   if (!err)
  248.     {
  249.       library = &(ioreq.io_Device->dd_Library);
  250.  
  251.       makeinfo (library, &lib->l_functions);
  252.  
  253.       Forbid ();
  254.  
  255.       for (fnode = lib->l_functions.lh_Head; fnode->ln_Succ; fnode = fnode->ln_Succ)
  256.     {
  257.       func = (RSYS_FUNCTION *) fnode;
  258.       funcptr = (RSYS_func *) ((ULONG) library - (ULONG) func->f_bias);
  259.  
  260.       if ((funcptr->adr < kickromstart) || (funcptr->adr > MAGIC_ROM_END))
  261.         {
  262.           makeentry (funcptr->adr, func);
  263.           j++;
  264.         }
  265.     }
  266.  
  267.       Permit ();
  268.  
  269.       CloseDevice (&ioreq);
  270.  
  271.       makesummary (j);
  272.     }
  273.   else
  274.     makehead ("Can't open device!");
  275.  
  276.   makeblank ();
  277.  
  278.   return;
  279. }
  280.  
  281.  
  282. void
  283. SysCheckOffs (void)
  284. {
  285.   int i;
  286.   NODE *node;
  287.   RSYS_LIBRARY *lib;
  288.  
  289.   HandleHelp (MN_SysCheckOffs);
  290.  
  291.   PrintHeader (LIBRARYOFFS, NULL);
  292.  
  293.   EmptyListView ();
  294.  
  295.   NewList (&FuncList);
  296.  
  297.   kickromstart = MAGIC_ROM_END - MAGIC_ROM_SIZE;
  298.  
  299.   makehead ("Kick-ROM Info");
  300.   makerominfo ((UBYTE *) "ROM Start ", kickromstart);
  301.   makeromsizeinfo ((UBYTE *) "ROM Size  ", MAGIC_ROM_SIZE);
  302.   makeblank ();
  303.  
  304.   if (Flags.dummy2)
  305.     for (node = Libraries.lh_Head; node->ln_Succ; node = node->ln_Succ)
  306.       {
  307.     lib = (RSYS_LIBRARY *) node;
  308.     if (lib->l_typ)
  309.       PrintLibOffsets (lib);
  310.     else
  311.       PrintDevOffsets (lib);
  312.       }
  313.   else
  314.     {
  315.       makeblank ();
  316.       makehead ((char *) field[NO_FD_FIELD]);
  317.     }
  318.  
  319.   countentries = CountNodes (&FuncList);
  320.  
  321.   Entries = AllocScrollEntries (countentries);
  322.  
  323.   for (i = 0, node = FuncList.lh_Head; i < countentries; i++, node = node->ln_Succ)
  324.     {
  325.       strcpy (Entries[i].se_Entry, node->ln_Name);
  326.  
  327.       AddNodeToList (i, NO_SORT, 0);
  328.     }
  329.  
  330.   KillMemory (NO_KILL);
  331.  
  332.   PrintStatistics ();
  333.  
  334.   return;
  335. }
  336.